#include "SyncQueue.hpp"
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>

// 测试生产者任务
void TestProducer(SyncQueue<int> &queue, int producerId)
{
    for (int i = 1; i <= 3; ++i)
    {
        int data = producerId * 100 + i; // 生成独特的数据，方便识别是哪个生产者生产的
        std::cout << "生产者[" << producerId << "] 准备生产数据: " << data << std::endl;
        queue.Put(data);
        std::cout << "生产者[" << producerId << "] 完成生产数据: " << data << std::endl;

        // 稍微延迟一下，方便观察
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
    }
}

// 测试消费者任务
void TestConsumer(SyncQueue<int> &queue, int consumerId)
{
    // 每个消费者消费4个数据后退出
    for (int i = 0; i < 4; ++i)
    {
        int data;
        std::cout << "消费者[" << consumerId << "] 准备消费数据" << std::endl;
        queue.Take(data);
        std::cout << "消费者[" << consumerId << "] 消费到数据: " << data << std::endl;

        // 稍微延迟一下，模拟处理数据的时间
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

void TestSyncQueue()
{
    std::cout << "=== 开始测试同步队列 ===" << std::endl;

    // 创建一个容量为5的同步队列
    SyncQueue<int> queue(5);

    // 创建2个生产者线程
    std::vector<std::thread> producers;
    for (int i = 0; i < 2; ++i)
    {
        producers.emplace_back(TestProducer, std::ref(queue), i + 1);
    }

    // 创建2个消费者线程
    std::vector<std::thread> consumers;
    for (int i = 0; i < 2; ++i)
    {
        consumers.emplace_back(TestConsumer, std::ref(queue), i + 1);
    }

    // 等待所有生产者完成
    for (auto &producer : producers)
    {
        producer.join();
    }

    // 等待所有消费者完成
    for (auto &consumer : consumers)
    {
        consumer.join();
    }

    std::cout << "=== 同步队列测试完成 ===" << std::endl;
}

void TestSyncQueueSimple()
{
    // 设置控制台输出编码为 UTF-8

    std::cout << "=== 开始简单同步队列测试 ===" << std::endl;

    SyncQueue<int> syncQueue(5);

    // 创建生产者线程
    std::thread producer([&syncQueue]()
                         {
        for (int i = 0; i < 20; ++i)
        {
            syncQueue.Put(888);
            //等待100ms
            //std::this_thread::sleep_for(std::chrono::milliseconds(100));
        } });

    // 创建消费者线程
    std::thread consumer([&syncQueue]()
                         {
        int x = 0;
        for (int i = 0; i < 60; ++i)
        {
            syncQueue.Take(x);
            std::cout << x << std::endl;
        } });

    producer.join();
    consumer.join();

    std::cout << "=== 简单同步队列测试完成 ===" << std::endl;
}

int main()
{
    // TestSyncQueue();
    TestSyncQueueSimple();
    return 0;
}